package util

import (
	"fmt"
	"github.com/satori/go.uuid"
	"io/ioutil"
	"os"
	"strconv"
	"sync"
)

func CreateUUid() string {
	u := uuid.NewV4()
	return u.String()
}
func IdGen() (int64, error) {
	filePath := "id.txt"
	generator, err := NewIDGenerator(filePath)
	if err != nil {
		fmt.Println("创建 ID 生成器失败:", err)
		return 0, err
	}
	id, err := generator.NextID()
	if err != nil {
		fmt.Println("生成 ID 失败:", err)
		return 0, err
	}
	return id, nil
}

// IDGenerator 是自增 ID 生成器结构体
type IDGenerator struct {
	mu       sync.Mutex
	nextID   int64
	filePath string
}

// NewIDGenerator 创建一个新的 ID 生成器实例
func NewIDGenerator(filePath string) (*IDGenerator, error) {
	g := &IDGenerator{
		filePath: filePath,
	}

	// 检查文件是否存在
	if _, err := os.Stat(filePath); err == nil {
		// 文件存在，读取其中保存的 ID
		data, err := ioutil.ReadFile(filePath)
		if err != nil {
			return nil, err
		}
		id, err := strconv.ParseInt(string(data), 10, 64)
		if err != nil {
			return nil, err
		}
		g.nextID = id
	} else if os.IsNotExist(err) {
		// 文件不存在，初始化 ID 为 1
		g.nextID = 1
	} else {
		return nil, err
	}

	return g, nil
}

// NextID 生成下一个自增 ID
func (g *IDGenerator) NextID() (int64, error) {
	g.mu.Lock()
	defer g.mu.Unlock()

	// 获取当前 ID
	id := g.nextID

	// 自增 ID
	g.nextID++

	// 将新的 ID 写入文件
	err := ioutil.WriteFile(g.filePath, []byte(strconv.FormatInt(g.nextID, 10)), 0644)
	if err != nil {
		return 0, err
	}

	return id, nil
}
